//设计循环队列
class MyCircularQueue {
    public int[] elem;
    public int front;
    public int rear;

    public MyCircularQueue(int k) {
        elem = new int[k + 1];// 浪费一个空间，也就是需要多开一个元素的空间
    }

    // 入队操作
    public boolean enQueue(int value) {
        if (isFull()) {
            return false;
        }
        elem[rear] = value;
        rear = (rear + 1) % elem.length;// 注意点1：不可直接rear+1
        return true;
    }

    // 删除队头元素（空不空 + front移动）
    public boolean deQueue() {
        if (isEmpty()) {
            return false;
        }
        front = (front + 1) % elem.length; // 注意点2：不可直接front+1
        return true;
    }

    // 得到队头元素 不删除
    public int Front() {
        if (isEmpty()) {
            return -1;
        }
        return elem[front];
    }

    // 得到队尾元素 不删除
    public int Rear() {
        if (isEmpty()) {
            return -1;
        }
        // rear=0说明刚刚走过一圈以上，那么队尾就为elem.length-1
        // rear!=0说明还没到跨越的位置，直接-1即可
        int index = (rear == 0) ? elem.length - 1 : rear - 1;
        return elem[index];
    }

    // 判空 front和rear都在起始点
    public boolean isEmpty() {
        return front == rear;
    }

    public boolean isFull() {
        return (rear + 1) % elem.length == front;
    }
}